package com.edu.exam.entity.classmanagement.teaching;

/**
 * 教学班状态枚举
 * [所属模块] F-06 教学班管理模块
 *
 * 定义教学班的生命周期状态。
 * 根据简化后的F-06模块设计，只保留4个核心状态。
 *
 * @author System
 * @version 3.0.0 (简化版)
 */
public enum TeachingClassStatus {

    /**
     * 计划中状态
     * 教学班已创建，尚未开始教学活动
     */
    PLANNED("PLANNED", "计划中"),

    /**
     * 教学中状态
     * 教学班正在进行教学活动
     */
    IN_PROGRESS("IN_PROGRESS", "教学中"),

    /**
     * 已结束状态
     * 教学班已完成所有教学活动
     */
    COMPLETED("COMPLETED", "已结束"),

    /**
     * 已取消状态
     * 教学班被取消，不再进行
     */
    CANCELLED("CANCELLED", "已取消");

    private final String code;
    private final String description;

    TeachingClassStatus(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 判断是否为终态
     */
    public boolean isFinal() {
        return this == COMPLETED || this == CANCELLED;
    }

    /**
     * 判断是否可以进行状态转换
     */
    public boolean canTransitionTo(TeachingClassStatus targetStatus) {
        // PLANNED 可以转换为 IN_PROGRESS 或 CANCELLED
        if (this == PLANNED) {
            return targetStatus == IN_PROGRESS || targetStatus == CANCELLED;
        }

        // IN_PROGRESS 可以转换为 COMPLETED 或 CANCELLED
        if (this == IN_PROGRESS) {
            return targetStatus == COMPLETED || targetStatus == CANCELLED;
        }

        // 终态不能转换
        return false;
    }

    /**
     * 根据代码获取枚举
     */
    public static TeachingClassStatus fromCode(String code) {
        for (TeachingClassStatus status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Unknown teaching class status code: " + code);
    }

    @Override
    public String toString() {
        return this.code + "(" + this.description + ")";
    }
}